﻿//实现一个算法，确定一个字符串 s 的所有字符是否全都不同。
class Solution {
public:
    bool isUnique(string astr) {
        int sum = 0, n = astr.size();
        for (int i = 0; i < n; i++) {
            int k = astr[i] - 'a';
            if ((sum >> k) & 1)return false;
            sum += 1 << k;
        }
        return true;
    }
};
使用位图和两个基本运算，判定是否为1和使为1



//给定一个包含[0, n] 中 n 个数的数组 nums ，找出[0, n] 这个范围内没有出现在数组中的那个数
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum ^= nums[i];
        }
        for (int i = 0; i <= n; i++)sum ^= i;
        return sum;
    }
};
//若使用位运算则后面再在数组后增加0到n这n+1个数字，全部异或，剩下的就是没有出现的



//给你两个整数 a 和 b ，不使用 运算符 + 和 - ​​​​​​​，计算并返回两整数之和。
class Solution {
public:
    int getSum(int a, int b) {
        return a == 0 ? b : getSum((a & b) << 1, a ^ b);
    }
};
//a^ b是原地进位，都是1为0，都是0为0，相异为1
//(a& b) << 1代表的是进位以后的结果，都是1才为1，再向左移一位
//递归两者一直相加直到没有进位的时候b就是结果
